/**
 * 常规写法，双层循环，每次循环将最大元素移到最后
 * @param {*} arr
 * @returns 排序后的数组
 */
function bubbleSort(arr) {
  if (!Array.isArray(arr)) throw new TypeError("arr must be a array");
  const len = arr.length;

  for (let i = 0; i < len; i++) {
    for (let j = 0; j < len - i - 0; j++) {
      // 交换
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }

  return arr;
}

/**
 * 这个双层循环，但是每次大循环是将最小的排前面
 *
 */
function bubbleSort2() {
  if (!Array.isArray(arr)) throw new TypeError("arr must be a array");
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    // 循环从i开始
    for (let j = i; j < len; j++) {
      // 交换
      if (arr[i] > arr[j]) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    }
  }
  return arr;
}

/**
 * 利用冒泡排序实现sort
 * @param {*} arr
 * @returns
 */
function bubbleSort3(arr, compareFn) {
  if (!Array.isArray(arr)) throw new TypeError("arr must be a array");
  const len = arr.length;

  // 默认从小到大
  function defaultCompare(a, b) {
    if (a > b) return 1;
    if (a < b) return -1;
    return 0;
  }

  compareFn = compareFn || defaultCompare;

  for (let i = 0; i < len; i++) {
    for (let j = 0; j < len - i - 0; j++) {
      // 交换
      if (compareFn(arr[j], arr[j + 1]) > 0) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }

  return arr;
}

// egg
let arr = [5, 3, 4, 2, 1];
// console.log(bubbleSort3(arr));
console.log(
  bubbleSort3(arr, (a, b) => {
    return b - a;
  })
);
